home *** CD-ROM | disk | FTP | other *** search
- #!/bin/csh -f
- #
- # This script should be executed to configure the Tcl source directory
- # for a particular system. It probes the system for various header
- # files and library object files. Where things needed by Tcl are missing,
- # substitute versions are included from the "compat" subdirectory.
- #
- # $Header: /user6/ouster/tcl/RCS/config,v 1.30 92/05/13 09:27:18 ouster Exp $ SPRITE (Berkeley)
- #
- # Copyright 1991, 1992 Regents of the University of California
- # Permission to use, copy, modify, and distribute this
- # software and its documentation for any purpose and without
- # fee is hereby granted, provided that this copyright
- # notice appears in all copies. The University of California
- # makes no representations about the suitability of this
- # software for any purpose. It is provided "as is" without
- # express or implied warranty.
-
- #--------------------------------------------------------------
- # The variable definitions below configure this script: they
- # tell where system-defined things are kept (so this program
- # can tell whether the system contains certain features needed
- # by Tcl), and they indicate which Tcl files to modify to
- # reflect the configuration.
-
- # Directory containing system include files:
-
- set includeDir="/usr/include"
-
- # Archive file containing object code for standard C library:
-
- set libc="/lib/libc.a"
-
- # Makefile to modify:
-
- set makefile="Makefile"
-
- # Header file to modify to hold #defines about system configuration:
-
- set config="tclUnix.h"
- #--------------------------------------------------------------
-
- set changes=0
- unset time
-
- # First make sure that the configuration variables have been
- # set in a reasonable fashion.
-
- if ( ! -r $includeDir/stdio.h ) then
- echo "- ERROR\!\! $includeDir doesn't seem to contain standard system"
- echo " include files. Please edit config to set the includeDir"
- echo " variable."
- exit(1)
- endif
- if ( ! -r $libc ) then
- echo "- ERROR\!\! C library $libc doesn\'t exist. Please edit config"
- echo " to set the libc variable."
- exit(1)
- endif
- nm -p $libc > tmp.libc
- if ( $status != 0 ) then
- echo "- ERROR\!\! Nm failed to extract names of system-supplied library"
- echo " procedures from $libc. You'll have to modify config by hand to"
- echo " fix the problem (whatever it is)."
- exit(1)
- endif
-
- # Since nm produces different output on different machines, the code
- # below attempts to guess what pattern to grep for in the nm output.
-
- set pattern="[ADIT]"
- set x=`grep printf tmp.libc | grep -c CODE`
- if ( $x ) then
- set pattern=CODE
- endif
- set x=`grep printf tmp.libc | grep -c extern`
- if ( $x ) then
- set pattern="|extern|"
- endif
-
- # Check in the C library for particular library procedures and
- # variables needed by Tcl.
-
- set gettod=`grep gettimeofday tmp.libc | grep -c "$pattern"`
- if ( $gettod > 1 ) set gettod=1
- set getwd=`grep getwd tmp.libc | grep -c "$pattern"`
- if ( $getwd > 1 ) set getwd=1
- set opendir=`grep opendir tmp.libc | grep -c "$pattern"`
- if ( $opendir > 1 ) set opendir=1
- set strerror=`grep strerror tmp.libc | grep -c "$pattern"`
- if ( $strerror > 1 ) set strerror=1
- set strstr=`grep strstr tmp.libc | grep -c "$pattern"`
- if ( $strstr > 1 ) set strstr=1
- set strtod=`grep strtod tmp.libc | grep -c "$pattern"`
- if ( $strtod > 1 ) set strtod=1
- set strtol=`grep strtol tmp.libc | grep -c "$pattern"`
- if ( $strtol > 1 ) set strtol=1
- set strtoul=`grep strtoul tmp.libc | grep -c "$pattern"`
- if ( $strtoul > 1 ) set strtoul=1
- set sys_errlist=`grep sys_errlist tmp.libc | grep -c "$pattern"`
- if ( $sys_errlist > 1 ) set sys_errlist=1
- \rm tmp.libc
-
- # Next, install header files that aren't present in /usr/include.
-
- set extraHdrs=""
- foreach i (dirent.h limits.h)
- \rm -f $i
- if ( ! -r $includeDir/$i ) then
- cp compat/$i .
- set extraHdrs="$extraHdrs $i"
- endif
- end
- set stdlibOK=0
- \rm -f stdlib.h
- if ( -r $includeDir/stdlib.h ) then
- # The check below is needed because SunOS has a stdlib that
- # doesn't declare strtod and other procedures, so we have to
- # use ours instead.
-
- set chk1=`grep -c strtol $includeDir/stdlib.h`
- set chk2=`grep -c strtoul $includeDir/stdlib.h`
- set chk3=`grep -c strtod $includeDir/stdlib.h`
- if ( $chk1 > 0 && $chk2 > 0 && $chk3 > 0 ) then
- set stdlibOK=1
- endif
- endif
- if ( ! $stdlibOK ) then
- cp compat/stdlib.h .
- set extraHdrs="$extraHdrs stdlib.h"
- endif
-
- # Even if string.h exists it's not complete on all systems. If
- # some of the procedures we need are missing from the library, then
- # also install a Tcl-specific string.h.
-
- \rm -f string.h
- if ( ! $strstr || ! $strtoul || ! -r $includeDir/string.h ) then
- cp compat/string.h .
- set extraHdrs="$extraHdrs string.h"
- endif
- if ( "$extraHdrs" != "" ) then
- echo "- Substitutes will be used for the following header files,"
- echo " which aren't in ${includeDir} or aren't complete:"
- echo " $extraHdrs"
- set changes=1
- endif
-
- # Even if strtoul exists, it is bogus on some AIX systems. Detect
- # this and pretend the system version doesn't exist if it's bogus.
-
- if ( $strtoul ) then
- cp compat/teststrtoul.c test.c
- make configtest >& /dev/null
- if ( $status == 0 ) then
- ./a.out
- if ( $status != 0 ) then
- set strtoul=0
- endif
- endif
- \rm -f a.out test.c
- endif
-
- # Next, install C procedures for missing library functions.
-
- set extraLibs=""
- \rm -f strerror.c
- if ( ! $strerror ) then
- set extraLibs="$extraLibs strerror"
- cp compat/strerror.c .
- endif
- \rm -f opendir.c
- if ( ! $opendir ) then
- set extraLibs="$extraLibs opendir"
- cp compat/opendir.c .
- \rm -f dirent.h
- cp compat/dirent2.h dirent.h
- echo "- No opendir/readdir/closedir library exists in this system,"
- echo " so substitutes will be provided. This system better have"
- echo " V7-style directories\!"
- endif
- \rm -f strstr.c
- if ( ! $strstr ) then
- set extraLibs="$extraLibs strstr"
- cp compat/strstr.c .
- endif
- \rm -f strtod.c
- if ( ! $strtod ) then
- set extraLibs="$extraLibs strtod"
- cp compat/strtod.c .
- endif
- \rm -f strtol.c
- if ( ! $strtol ) then
- set extraLibs="$extraLibs strtol"
- cp compat/strtol.c .
- endif
- \rm -f strtoul.c
- if ( ! $strtoul ) then
- set extraLibs="$extraLibs strtoul"
- cp compat/strtoul.c .
- endif
- if ( "$extraLibs" != "" ) then
- echo "- Substitutes will be used for the following library procedures,"
- echo " which aren't in ${libc} or don't work correctly:"
- echo " $extraLibs"
- set changes=1
- endif
-
- # The following statements determine whether ranlib should be used
- # in the Makefile. On System-V systems it shouldn't. The only way
- # to figure this out is to run ranlib and see if it complains (ranlib
- # actually exists on some Sys-V systems, but it returns an error if
- # you run it).
-
- set ranlibOK=0
- cat > ranlibtest.c << EOF
- #include <stdio.h>
- main (argc, argv)
- int argc;
- char **argv;
- {
- printf ("Hello, world.\n");
- }
- EOF
- cc -c ranlibtest.c
- ar cru ranlibtest.a ranlibtest.o
- ranlib ranlibtest.a >& /dev/null
- if ( $status == 0 ) then
- set ranlibOK=1
- else
- echo "- This system appears to be a System V one where ranlib isn't"
- echo " used. The ranlib commands will be removed from Makefile."
- set changes=1
- endif
- \rm -f ranlibtest.*
-
- # Modify the Makefile to include supplemental library sources, if needed.
-
- set compatObjs=""
- foreach i ($extraLibs)
- set compatObjs="$compatObjs $i.o"
- end
- if ( ! -e $makefile.bak ) mv $makefile $makefile.bak
- if ( $ranlibOK ) then
- sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" $makefile.bak > $makefile
- else
- sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" \
- -e "/ranlib/d" $makefile.bak > $makefile
- endif
-
- # Set the #defines in tclUnix.h to provide various pieces of system
- # configuration information at compile time (existence of header files,
- # variables, type definitions, etc.)
-
- if ( ! $gettod ) then
- echo "- There's no gettimeofday in ${libc} so Tcl will use"
- echo ' times for the "time" command.'
- set changes=1
- endif
- if ( ! $getwd ) then
- echo "- There's no getwd in ${libc} so Tcl will use"
- echo ' getcwd for the "pwd" command.'
- set changes=1
- endif
- set errlist=1
- if ( ! $sys_errlist && ! $strerror ) then
- echo "- Neither strerror nor sys_errlist is defined in ${libc} so"
- echo " Tcl will make a guess about errno-related messages."
- set errlist=0
- set changes=1
- endif
- set sysTime=0
- if ( -r $includeDir/sys/time.h ) then
- set sysTime=1
- endif
- set sysWait=0
- set unionWait=0
- if ( -r $includeDir/sys/wait.h ) then
- set sysWait=1
- cp compat/testwait.c test.c
- make configtest >& /dev/null
- if ( $status == 0 ) then
- set unionWait=1
- endif
- \rm -f a.out test.c
- endif
- set pid_t=1
- cp compat/testpid.c test.c
- make configtest >& /dev/null
- if ( $status != 0 ) then
- set pid_t=0
- echo "- The type pid_t isn't defined in <sys/types.h> so Tcl will"
- echo ' use "int" instead.'
- endif
- \rm -f a.out test.c
- set uid_t=1
- cp compat/testuid.c test.c
- make configtest >& /dev/null
- if ( $status != 0 ) then
- set uid_t=0
- echo "- The type uid_t isn't defined in <sys/types.h> so Tcl will"
- echo ' use "int" instead.'
- endif
- \rm -f a.out test.c
- if ( ! -e $config.bak ) mv $config $config.bak
- set x=\.\*\$
- sed -e "s/define TCL_GETTOD 1/define TCL_GETTOD $gettod/" \
- -e "s/define TCL_GETWD 1/define TCL_GETWD $getwd/" \
- -e "s/define TCL_SYS_ERRLIST 1/define TCL_SYS_ERRLIST $errlist/" \
- -e "s/define TCL_SYS_TIME_H 1/define TCL_SYS_TIME_H $sysTime/" \
- -e "s/define TCL_SYS_WAIT_H 1/define TCL_SYS_WAIT_H $sysWait/" \
- -e "s/define TCL_UNION_WAIT 1/define TCL_UNION_WAIT $unionWait/" \
- -e "s/define TCL_PID_T 1/define TCL_PID_T $pid_t/" \
- -e "s/define TCL_UID_T 1/define TCL_UID_T $uid_t/" \
- $config.bak > $config
-
- if ( ! $changes ) then
- echo "- No special modifications were needed for this system."
- endif
-